import dayjs from 'dayjs'

/**
 * 获取指定日期 N 天后的日期字符串
 *
 * @param date - 起始日期字符串，支持 dayjs 可解析的格式，如 '2021-12-25'
 * @param n - 天数，正数表示向后推移，负数表示向前推移
 * @param format - 返回日期格式，默认值为 'YYYY-MM-DD'，支持 dayjs 格式化规则
 * @returns 格式化后的日期字符串
 *
 * @throws {Error} 当 `date` 格式非法时抛出错误
 * @throws {Error} 当 `n` 不是有效数字时抛出错误
 * @throws {Error} 当 `format` 不是字符串时抛出错误
 *
 * @example
 * ```ts
 * getDateAfterNDays('2021-12-25', 5)       // '2021-12-30'
 * getDateAfterNDays('2021-12-25', -10)     // '2021-12-15'
 * getDateAfterNDays('2021-12-25', 1, 'YYYY/MM/DD')  // '2021/12/26'
 * ```
 */
export function getDateAfterNDays(date: string, n: number, format = 'YYYY-MM-DD'): string {
  if (!dayjs(date).isValid()) {
    throw new Error(`[getDateAfterNDays] 非法的日期格式: ${date}`)
  }
  if (typeof n !== 'number' || isNaN(n)) {
    throw new Error('[getDateAfterNDays] 参数 n 必须为数字')
  }
  if (typeof format !== 'string') {
    throw new Error('[getDateAfterNDays] 参数 format 必须为字符串')
  }

  return dayjs(date).add(n, 'day').format(format)
}

export default getDateAfterNDays
